package com.legendframework.core.dao;

import com.legendframework.core.dao.exception.DaoException;

import java.io.Serializable;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.util.List;

/**
 * 提供默认值的实体类值
 *
 * Entity 实体类类型
 */
public interface DefaultEntityValue<Entity> {

    /**
     * 获取默认的数据
     * 如果实体类实现了这个接口，会默认将这些数据保存
     * 这个接口会在插件加载成功后被执行
     * 多用于 插件配置文件 插件第一次加载执行的场景
     * @return
     */
    default List<Entity> getDefaultEntitys(){
        return null;
    }

    /**
     * 获取默认的数据
     * 如果实体类实现了这个接口，当主动调用了 {@link com.legendframework.core.dao.extension.service.IService#saveDefault(Serializable)}
     * 后，会执行这个方法进行主动生成配置文件
     * 多用与玩家初次进入服务器生成配置文件
     * @param id 需要保存的ID
     * @return
     */
    default Entity getDefaultEntity(Serializable id){return null;}

    /**
     * 获取实体类中的默认数据
     * @param entityCls 实体类
     * @param <T>
     * @return
     */
    static <T> List<T> getEntitys(Class<T> entityCls){
        if (!DefaultEntityValue.class.isAssignableFrom(entityCls)) {
            return null;
        }
        try {
            Constructor<T> constructor = entityCls.getConstructor();
            T t = constructor.newInstance();
            return ((DefaultEntityValue<T>) t).getDefaultEntitys();
        } catch (NoSuchMethodException | IllegalAccessException | InstantiationException | InvocationTargetException e) {
            throw new DaoException("获取Entity的初始数据失败：",e);
        }
    }

    /**
     * 获取实体类中的默认数据
     * @param entityCls 实体类
     * @param <T>
     * @return
     */
    static <T> T getEntity(Class<T> entityCls , Serializable id){
        if (!DefaultEntityValue.class.isAssignableFrom(entityCls)) {
            return null;
        }
        try {
            Constructor<T> constructor = entityCls.getConstructor();
            T t = constructor.newInstance();
            return ((DefaultEntityValue<T>) t).getDefaultEntity(id);
        } catch (NoSuchMethodException | IllegalAccessException | InstantiationException | InvocationTargetException e) {
            throw new DaoException("获取Entity的初始数据失败：",e);
        }
    }

}
